import pandas as pd
from openpyxl import load_workbook, Workbook
from openpyxl.utils.exceptions import InvalidFileException
import os


def process_access_points_with_full_info(input_file, output_file=None):
    """
    处理门禁数据：根据门禁点信息创建对应工作表，并添加完整行信息（排除门禁点列，自动去重）
    
    Parameters:
    input_file: 输入Excel文件路径
    output_file: 输出Excel文件路径（可选）
    
    Returns:
    tuple: (输出文件路径, 处理的设备列表, 统计信息)
    """

    if output_file is None:
        output_file = input_file.replace('.xlsx', '_processed.xlsx')

    try:
        # 读取原始数据
        print("正在读取数据文件...")
        df = pd.read_excel(input_file)

        # 验证必要列是否存在
        required_columns = ['姓名', '门禁点']
        missing_columns = [
            col for col in required_columns if col not in df.columns
        ]
        if missing_columns:
            raise ValueError(f"缺少必要列: {missing_columns}")

        # 获取所有列名（用于保存完整信息），但排除'门禁点'列
        all_columns = [col for col in df.columns.tolist() if col != '门禁点']
        print(f"数据列（排除门禁点）: {all_columns}")

        # 初始化工作簿
        if os.path.exists(output_file):
            wb = load_workbook(output_file)
            print(f"加载现有文件: {output_file}")
        else:
            wb = Workbook()
            # 删除默认创建的空白工作表
            wb.remove(wb.active)
            print(f"创建新工作簿: {output_file}")

        # 获取所有现有工作表名称
        existing_sheets = set(wb.sheetnames)
        print(f"现有工作表: {existing_sheets}")

        # 用于跟踪所有处理过的设备
        all_devices = set()

        # 用于跟踪每个工作表中已存在的姓名（避免重复添加）
        sheet_name_records = {}

        # 初始化sheet_name_records（从现有工作表加载已存在的姓名）
        for sheet_name in existing_sheets:
            ws = wb[sheet_name]
            names_in_sheet = set()

            # 读取现有工作表中的所有姓名（假设姓名在第一列）
            for row in ws.iter_rows(min_row=2,
                                    values_only=True):  # 从第2行开始（跳过表头）
                if row and row[0]:  # 确保行有数据且姓名不为空
                    names_in_sheet.add(str(row[0]).strip())

            sheet_name_records[sheet_name] = names_in_sheet

        # 遍历每一行数据
        print("\n开始处理数据行...")
        total_rows = len(df)
        added_records = 0
        skipped_duplicates = 0

        for index, row in df.iterrows():
            name = str(row['姓名']).strip()
            access_points = str(row['门禁点']).strip() if pd.notna(
                row['门禁点']) else ""

            print(f"处理第 {index + 1}/{total_rows} 行: 姓名={name}")

            # 跳过空的门禁点
            if not access_points or access_points == 'nan':
                print(f"  → 跳过: 门禁点为空")
                continue

            # 分割门禁点设备
            devices = [
                device.strip() for device in access_points.split(';')
                if device.strip()
            ]

            for device in devices:
                all_devices.add(device)

                # 如果设备工作表不存在，则创建
                if device not in existing_sheets:
                    ws = wb.create_sheet(title=device)
                    # 添加完整表头（所有列，但排除门禁点）
                    ws.append(all_columns)
                    sheet_name_records[device] = set()
                    existing_sheets.add(device)
                    print(f"  → 创建新工作表: {device}")
                else:
                    ws = wb[device]

                # 检查姓名是否已存在，避免重复添加
                if name not in sheet_name_records[device]:
                    # 添加完整行数据（排除门禁点列）
                    row_data = [row[col] for col in all_columns]
                    ws.append(row_data)
                    sheet_name_records[device].add(name)
                    added_records += 1
                    print(f"  → 添加 {name} 的完整信息到 {device} 工作表")
                else:
                    skipped_duplicates += 1
                    print(f"  → {name} 已在 {device} 工作表中，跳过重复添加")

        # 保存文件
        print("\n正在保存文件...")
        wb.save(output_file)

        # 生成统计信息
        stats = generate_detailed_statistics(wb, all_devices, added_records,
                                             skipped_duplicates, total_rows)

        print(f"\n✅ 处理完成！")
        print(f"输出文件: {output_file}")
        print(f"处理门禁点数量: {len(all_devices)}")
        print(f"总处理行数: {total_rows}")
        print(f"新增记录数: {added_records}")
        print(f"跳过重复数: {skipped_duplicates}")

        return output_file, list(all_devices), stats

    except FileNotFoundError:
        print(f"❌ 错误: 文件未找到 - {input_file}")
        return None, None, None
    except InvalidFileException:
        print(f"❌ 错误: 文件格式无效 - {input_file}")
        return None, None, None
    except Exception as e:
        print(f"❌ 处理过程中出现错误: {e}")
        import traceback
        traceback.print_exc()
        return None, None, None


def generate_detailed_statistics(wb, devices, added_records,
                                 skipped_duplicates, total_rows):
    """
    生成详细统计信息
    """
    stats = {
        'total_sheets': len(wb.sheetnames),
        'device_stats': {},
        'total_people': 0,
        'added_records': added_records,
        'skipped_duplicates': skipped_duplicates,
        'total_rows_processed': total_rows
    }

    for device in devices:
        if device in wb.sheetnames:
            ws = wb[device]
            # 计算该工作表中的记录数（减去表头）
            record_count = max(0, ws.max_row - 1)
            stats['device_stats'][device] = record_count
            stats['total_people'] += record_count

    return stats


def print_comprehensive_report(output_file, stats, devices):
    """
    打印综合报告
    """
    print("\n" + "=" * 60)
    print("📊 综合处理报告")
    print("=" * 60)

    wb = load_workbook(output_file)

    print(f"📁 输出文件: {output_file}")
    print(f"📑 总工作表数: {stats['total_sheets']}")
    print(f"👥 总人员记录数: {stats['total_people']}")
    print(f"📈 新增记录数: {stats['added_records']}")
    print(f"🔄 跳过重复数: {stats['skipped_duplicates']}")
    print(f"📋 总处理行数: {stats['total_rows_processed']}")

    print("\n🚪 各门禁点人员分布:")
    for device, count in stats['device_stats'].items():
        print(f"  📍 {device}: {count} 人")

    print("\n📖 各工作表详细信息:")
    for sheet_name in wb.sheetnames:
        ws = wb[sheet_name]
        record_count = max(0, ws.max_row - 1)

        print(f"\n  📋 工作表 '{sheet_name}' ({record_count} 条记录)")

        # 显示表头
        header = [cell.value for cell in ws[1]]
        print(f"    表头: {header}")

        # 显示前3条记录作为样本
        sample_count = min(3, record_count)
        for i in range(2, 2 + sample_count):  # 从第2行开始（数据行）
            if i <= ws.max_row:
                row_data = [cell.value for cell in ws[i]]
                print(f"    样本{i-1}: {row_data}")

        if record_count > 3:
            print(f"    ... 还有 {record_count - 3} 条记录")


def create_access_point_sample_data():
    """
    创建包含门禁点信息的测试数据
    """
    sample_data = {
        '姓名': ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十', '郑十一', '王十二'],
        '门禁点': [
            '大门;办公楼正门', '大门;车间入口', '办公楼正门;实验室门禁', '车间入口;仓库大门', '大门;办公楼正门;车间入口',
            '实验室门禁', '大门;仓库大门', '办公楼正门', '车间入口;实验室门禁', '大门;办公楼正门;实验室门禁'
        ],
        '部门':
        ['行政部', '生产部', '研发部', '仓储部', '管理部', '研发部', '安保部', '行政部', '生产部', '研发部'],
        '工号':
        ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010'],
        '职位': [
            '经理', '工程师', '研究员', '仓管员', '总监', '高级研究员', '保安队长', '专员', '技术员',
            '初级研究员'
        ],
        '入职日期': [
            '2020-01-15', '2019-03-20', '2021-07-10', '2018-11-05',
            '2017-05-30', '2022-02-14', '2019-09-22', '2020-12-01',
            '2021-04-18', '2022-08-09'
        ],
        '联系方式': [
            '13800138001', '13800138002', '13800138003', '13800138004',
            '13800138005', '13800138006', '13800138007', '13800138008',
            '13800138009', '13800138010'
        ]
    }

    df = pd.DataFrame(sample_data)
    output_path = '门禁点数据样本.xlsx'
    df.to_excel(output_path, index=False)
    print(f"✅ 门禁点测试数据已创建: {output_path}")
    return output_path


class AccessPointProcessor:

    def __init__(self):
        self.processed_data = {}

    def process_with_analysis(self, input_file, output_file=None):
        """
        带分析功能的高级处理
        """
        result_file, devices, stats = process_access_points_with_full_info(
            input_file, output_file)

        if result_file:
            self.processed_data = {
                'output_file': result_file,
                'devices': devices,
                'statistics': stats
            }
            self.print_analysis_report()
            return self.processed_data
        return None

    def print_analysis_report(self):
        """打印分析报告"""
        print("\n" + "🔍 深度分析报告")
        print("-" * 40)

        stats = self.processed_data['statistics']
        devices = self.processed_data['devices']

        print(f"📁 输出文件: {self.processed_data['output_file']}")
        print(f"📊 总门禁点数量: {len(devices)}")
        print(f"👥 唯一人员记录: {stats['total_people']}")

        # 计算重复率
        total_operations = stats['added_records'] + stats['skipped_duplicates']
        if total_operations > 0:
            duplicate_rate = (stats['skipped_duplicates'] /
                              total_operations) * 100
            print(f"🔄 重复率: {duplicate_rate:.2f}%")

        # 按人员数量排序
        sorted_devices = sorted(stats['device_stats'].items(),
                                key=lambda x: x[1],
                                reverse=True)

        print("\n🏆 门禁点使用排名:")
        for i, (device, count) in enumerate(sorted_devices, 1):
            if stats['total_people'] > 0:
                usage_percent = (count / stats['total_people']) * 100
                print(f"  {i}. {device}: {count} 人 ({usage_percent:.1f}%)")
            else:
                print(f"  {i}. {device}: {count} 人")

        # 找出最常用的门禁点
        if stats['device_stats']:
            max_device = max(stats['device_stats'].items(), key=lambda x: x[1])
            min_device = min(stats['device_stats'].items(), key=lambda x: x[1])
            print(f"\n📈 门禁点覆盖分析:")
            print(f"  最常用门禁点: {max_device[0]} ({max_device[1]}人)")
            print(f"  最少用门禁点: {min_device[0]} ({min_device[1]}人)")


def validate_input_file(file_path):
    """
    验证输入文件格式和内容
    """
    try:
        df = pd.read_excel(file_path)

        if '门禁点' not in df.columns:
            print("❌ 错误: 输入文件必须包含'门禁点'列")
            return False

        if '姓名' not in df.columns:
            print("❌ 错误: 输入文件必须包含'姓名'列")
            return False

        # 检查门禁点数据的有效性
        valid_rows = 0
        for index, row in df.iterrows():
            access_points = str(row['门禁点']).strip() if pd.notna(
                row['门禁点']) else ""
            if access_points and access_points != 'nan':
                valid_rows += 1

        print(f"✅ 文件验证通过: {valid_rows} 行有效门禁点数据")
        return True

    except Exception as e:
        print(f"❌ 文件验证失败: {e}")
        return False


"""
 注解：
 每一个姓名可能属于多个设备门禁，python实现遍历属性列：门禁点 ，假设门禁点属性列的该单元格具有多个设备门禁点，以;隔开，遍历每一行该列门禁点的单元格，如果没有该设备门禁点名称的工作表，就新建以该设备门门禁点为名称的唯一工作表。而且把每一个属于相关设备门禁点工作表的 姓名  的该行信息，都添加至对应工作表中，每个表姓名要去重复，创建统计汇总工作表统计所有工作表的行数（不包括首行）。

"""

# 使用示例和主程序
if __name__ == "__main__":
    print("🚀 开始处理门禁点数据（排除门禁点列）...")

    # 如果没有数据文件，先创建样本数据
    input_file = "C:\\Users\\00\\Desktop\\每日动环\\按人授权权限列表.xlsx"
    if not os.path.exists(input_file):
        print("未找到数据文件，创建门禁点样本数据...")
        input_file = create_access_point_sample_data()

    # 验证输入文件
    if not validate_input_file(input_file):
        print("❌ 输入文件验证失败，程序退出")
        exit(1)

    # 处理数据
    output_file, devices, stats = process_access_points_with_full_info(
        input_file)

    if output_file:
        # 打印详细报告
        print_comprehensive_report(output_file, stats, devices)

        # 使用高级分析
        print("\n" + "=" * 60)
        processor = AccessPointProcessor()
        processor.process_with_analysis(input_file, output_file)

        print(f"\n🎉 所有处理完成！")
        print(f"您可以在 '{output_file}' 中查看结果")

        # 显示最终文件结构
        print(f"\n📂 最终文件包含的工作表:")
        wb = load_workbook(output_file)
        for sheet_name in wb.sheetnames:
            ws = wb[sheet_name]
            record_count = max(0, ws.max_row - 1)
            print(f"  📄 {sheet_name}: {record_count} 条记录")
    else:
        print("❌ 处理失败，请检查错误信息")
